/*
 * AplicationManager.java
 *
 * Created on 13 de diciembre de 2007, 14:36
 *
 */

package es.team.tareas.management;

import es.team.util.LogUtil;
import es.team.util.PropertyConfig;
import es.team.util.beans.Transaction;
import es.team.exceptions.BadConfigException;
import org.apache.log4j.Logger;

/**
 * Clase que agrupa funcionalidades para la aplicacion, un Facade.
 * @author Victor Gimeno (SGV, SL)
 */
public class AplicationManager {
    
    //**********CLAVES DEL FICHERO CONFIG.properties
    private static final String PREFIX = "es.aragon.";
    
    /* Para propositos de desarrollo unicamente */
    public static final String BBDD_OPEN = PREFIX + "BBDD_OPEN";
    
    /** OPCIONAL: indica si se deben cargar las collection del RepositoryManager o no. */
    public static final String LOAD_COLLECTIONS_REPOSITORY =  PREFIX + "LOAD_COLLECTIONS_REPOSITORY";
    
    /** Ruta del fichero de propiedades para configurar el logger. */
    public static final String LOGGER_PROPERTIES_PATH = PREFIX + "LOGGER_PROPERTIES_PATH";

    /* Nombre del logger de control de la apliacion */
    public static final String LOGGER_CONTROL_NAME = PREFIX + "LOGGER_CONTROL_NAME";
    
    /* Nombre del logger de control de la apliacion */
    public static final String LOGGER_MAIL = PREFIX + "LOGGER_MAIL";
    
    /** Logger de la aplicacion */
    public static final String LOGGER_NAME = PREFIX + "LOGGER_NAME";
    
    /** Ruta del Logo*/
    public static final String LOGO = PREFIX + "LOGO";
    
    /** Nombre del datasource de cada apliacion */
    public static final String DS_NAME = PREFIX + "DS_NAME";

    /** Nombre del Rol basico de cada aplicacion */
    public static final String BASIC_ROL_NAME = PREFIX + "BASIC_ROL_NAME";

    /** Nombre del Rol principal de cada aplicacion */
    public static final String MAIN_ROL_NAME = PREFIX + "MAIN_ROL_NAME";

    /** Nombre del usuario propietario del esquema para la aplicacion */
    public static final String PROP_NAME = PREFIX + "PROP_NAME";

    /** Nombre del usuario propietario del esquema para la aplicacion */
    public static final String SQL = PREFIX + "SQL";
    
    /** Numero de campos de peticion que va a tener la solicitud */
    public static final String NUM_CAMPOS_PETICION_SOL_PRIMARIA = PREFIX + "NUM_CAMPOS_PETICION_SOL_PRIMARIA";
    public static final String NUM_CAMPOS_PETICION_SOL_SECUNDARIA = PREFIX + "NUM_CAMPOS_PETICION_SOL_SECUNDARIA";
        
    /** Numero de campos por columna que va a tener la solicitud */
    public static final String NUM_CAMPOS_COLUMNA_SOL = PREFIX + "NUM_CAMPOS_COLUMNA_SOL";
        

    public static final String PATH_IMG = PREFIX +  "PATH_IMG";
    public static final String PATH_CSS = PREFIX + "PATH_CSS";
    public static final String PATH_JS = PREFIX + "PATH_JS";
    public static final String PATH_FICHEROS = PREFIX + "PATH_FICHEROS";

    /** Crea una nueva instancia de AplicationManager */
    private AplicationManager(  ) {
        
    }
    
    /**
     * Comprueba los valores minimos que se deben a ver indicado en el archivo de configuracion
     * 
     * @throws BadConfigException si el fichero de configuracion es invalido
     */
    public static final void checkDefinitions() throws BadConfigException {
        
        if( (PropertyConfig.getStringProperty(BBDD_OPEN) == null ) ||
            (PropertyConfig.getStringProperty(LOGGER_PROPERTIES_PATH) == null ) ||
            (PropertyConfig.getStringProperty(LOGGER_CONTROL_NAME) == null) ||
//            (PropertyConfig.getStringProperty(LOGGER_MAIL) == null) ||
            (PropertyConfig.getStringProperty(LOGGER_NAME) == null) ||
            (PropertyConfig.getStringProperty(DS_NAME) == null) ||
            (PropertyConfig.getStringProperty(LOGO) == null) ||
            (PropertyConfig.getStringProperty(BASIC_ROL_NAME) == null) ||
            (PropertyConfig.getStringProperty(MAIN_ROL_NAME) == null) ||
            (PropertyConfig.getStringProperty(PROP_NAME) == null) ||
            (PropertyConfig.getStringProperty(SQL) == null) ||
            (PropertyConfig.getStringProperty(NUM_CAMPOS_PETICION_SOL_PRIMARIA) == null) ||
            (PropertyConfig.getStringProperty(NUM_CAMPOS_PETICION_SOL_SECUNDARIA) == null) ||
            (PropertyConfig.getStringProperty(PATH_IMG) == null) ||
            (PropertyConfig.getStringProperty(PATH_CSS) == null) ||
            (PropertyConfig.getStringProperty(PATH_JS) == null) ||
            (PropertyConfig.getStringProperty(PATH_FICHEROS) == null) ||
            (PropertyConfig.getStringProperty(NUM_CAMPOS_COLUMNA_SOL) == null)                 
                ){
            System.out.println("Error de configuracion para la aplicacion, revisar config.properties.");
            throw new BadConfigException("Error de configuracion para la aplicacion, revisar config.properties.");
        }
            //System.out.println("Configuracion para la aplicacion, config.properties.");
            
    }
    
    /**
     * Metodo para sabes si la base de datos esta abierta o no
     * @return Si la base de datos esta abierta o no
     */
    public static final boolean isBbddOpen(){
        
        return PropertyConfig.getBooleanProperty( BBDD_OPEN ).booleanValue();
    }
           
    /**
     * Metodo para comprobar si hay que cargar el repositorio con las collections de datos.
     * @return si hay que cargar o no el repositorio con las collections
     */
    public static final boolean loadCollectionsRepository(){
        
        return PropertyConfig.getBooleanProperty( LOAD_COLLECTIONS_REPOSITORY ).booleanValue();
    }
    
    /**
     * Metodo para obtener la ruta del fichero de configuracion de los logs
     * @return ruta del fichero de configuracion del log.
     */
    public static final String getLogConfigPath(){
        
        return PropertyConfig.getStringProperty( AplicationManager.LOGGER_PROPERTIES_PATH  );
        
    }
    
    /**
     * Metodo para obtener el logger por defecto de la aplicacion.
     * @return el logger por defecto de la aplicacion.
     */
    public static final Logger getControlLogger(){
        
        String loggerName =  PropertyConfig.getStringProperty( LOGGER_CONTROL_NAME );
        
        return Logger.getLogger( loggerName );
        
    }
    
    /**
     * Metodo para obtener el logger por defecto de la aplicacion.
     * @return el logger por defecto de la aplicacion.
     */
    public static final Logger getMailLogger(){
        
        String loggerName =  PropertyConfig.getStringProperty( LOGGER_MAIL );
        
        return Logger.getLogger( loggerName );
        
    }
    
    /**
     * Metodo para obtener el logger de la aplicacion.
     * @return el loggerde la aplicacion.
     */
    public static final Logger getLogger(){
        
        String loggerName =  PropertyConfig.getStringProperty( LOGGER_NAME );
        
        return Logger.getLogger( loggerName );
        
    }
    
     /*M�todo para obtener ruta del Logo de los PDF*/
    public static final String getLogo(){
        return PropertyConfig.getStringProperty( LOGO );
    }
//      
//    /**
//     * Metodo para obtene el nombre del dataSource de una aplicacion.
//     * @return String Cadena con el nombre del dataSource de esa aplicacion.
//     */
    public static final String getDsName(){
        
        return PropertyConfig.getStringProperty( DS_NAME );
    }
//
//    /**
//     * Metodo para obtene el fichero de consultas de la aplicacion
//     * @return String Cadena con la ruta del fichero de consultas.
//     */
    public static final String getSqlFilePath(  ){
        
        return PropertyConfig.getStringProperty( SQL );
        
    }
//    
//    public static final void logControlMessage( String msg, Throwable t ){
//        try {
//
//            LogUtil.logControl(getControlLogger(), msg, t);
//            
//        } catch (Exception ignored) {
//            ;//No trato la excepcion, puesto que no se puede usar System.out
//        }
//        
//    }
//    
    /**
     * Metodo para obtener los datos de conexion de cada aplicacion en un objeto.
     * @return Objeto con los datos de conexion
     */
    public static final Transaction getConectionData(){
        
        Transaction conectData =  new Transaction( );
//        conectData.setDsName( "jdbc/sigi" );
//        conectData.setBasicRolName( "SIGIN" );
//        conectData.setMainRolName( "EDU_ROL_SIGIN" );
//        conectData.setPropName( "EDUSIGINWEB" );
        
        conectData.setDsName( PropertyConfig.getStringProperty( DS_NAME ) );
        conectData.setBasicRolName( PropertyConfig.getStringProperty( BASIC_ROL_NAME ) );
        conectData.setMainRolName( PropertyConfig.getStringProperty( MAIN_ROL_NAME ) );
        conectData.setPropName( PropertyConfig.getStringProperty( PROP_NAME ) );

       return conectData;
    }
    
//    /**
//     * Metodo set de la property num_campos
//     * @return Numero total de campos (de peticiones) que tiene la solicitud
//     */
//     public static final int getNum_campos_primaria() {
//        String sValor = PropertyConfig.getStringProperty( NUM_CAMPOS_PETICION_SOL_PRIMARIA );
//        int iAux = Integer.parseInt(sValor);
//        return iAux;
//     }
//     public static final int getNum_campos_secundaria() {
//        String sValor = PropertyConfig.getStringProperty( NUM_CAMPOS_PETICION_SOL_SECUNDARIA );
//        int iAux = Integer.parseInt(sValor);
//        return iAux;
//     }
    /**
     * Metodo get de la property alto_columna
//     * @return Numero de campos (peticiones) por columna que tiene la solicitud
//     */
//    public static final int getAlto_columna() {
//        String sValor = PropertyConfig.getStringProperty( NUM_CAMPOS_COLUMNA_SOL );
//        int iAux = Integer.parseInt(sValor);
//        return iAux;
//    }

//
    public static final String getImgPath(  ){        
        return PropertyConfig.getStringProperty( PATH_IMG );        
    }
    public static final String getCssPath(  ){        
        return PropertyConfig.getStringProperty( PATH_CSS );        
    }
    public static final String getJsPath(  ){        
        return PropertyConfig.getStringProperty( PATH_JS );        
    }
    public static final String getFicherosPath(  ){        
        return PropertyConfig.getStringProperty( PATH_FICHEROS );        
    }
/*public static final String PATH_IMG = "PATH_IMG";
    public static final String PATH_CSS = "PATH_CSS";
    public static final String PATH_JS = "PATH_JS";
    public static final String PATH_FICHEROS = "PATH_FICHEROS";
*/
}
